package com.quanyan.stadium.component.task;

import com.quanyan.stadium.biz.BizGameOrderDao;
import com.quanyan.stadium.service.commonComponent.DataReductionService;
import com.quanyan.stadium.service.commonComponent.GameMQLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by xiaoxiao on 16/5/31.
 */
//@Component
public class ScheduledTask {

    private static Logger logger = LoggerFactory.getLogger(ScheduledTask.class);
    private AtomicInteger count = new AtomicInteger();
    private Integer refreshStorageCount = 0;

    @Autowired
    private DataReductionService dataReductionService;

    @Autowired
    BizGameOrderDao gameOrderDao;

    @Autowired
    private GameMQLog gameMQLog;

    @Scheduled(cron = "0 0/2 * * * ?")
    public void clearExpireOrder() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info("{}自动回收不合法订单,第{}次执行，执行时间为：{}", "clearExpireOrder", count.addAndGet(1),
            dateFormat.format(new Date()));
        Long time = System.currentTimeMillis();
        Integer count = gameOrderDao.clearExpireOrder();
        logger.info("耗时{}秒，处理{}订单！", (System.currentTimeMillis() - time) / 1000, count);
    }
    

    /**
     * 每隔3分钟 自动刷新赛事的报名状态
     *
     * */
    @Scheduled(cron = "0 0/3 * * * ?")
    public void insertGameEventScore() throws InterruptedException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info(String.format("官方赛事分数排名记录--->>>第%s次执行，当前时间为：%s", refreshStorageCount++, dateFormat.format(new Date())));
        try {
            dataReductionService.officialGameEventTeamJoin();
        }catch (Exception e){
            logger.debug("官方赛事分数排名记录--->>>第%s次执行失败,原因: {}", e);
        }
    }
    /**
     * 每隔3分钟 自动刷新报名的信息
     *
     * */
    @Scheduled(cron = "0 0/3 * * * ?")
    public void updateGameEventScore() throws InterruptedException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info(String.format("官方赛事分数推位记录--->>>第%s次执行，当前时间为：%s", refreshStorageCount++, dateFormat.format(new Date())));
        try {
            dataReductionService.officialComplentGameEventTeamJoin();
        }catch (Exception e){
            logger.error("官方赛事分数推位记录--->>>第%s次执行失败,原因: {}", e);
        }
    }

    /**
     * 每天2点,定时刷新比赛数量
     *
     * */
    @Scheduled(cron = "0 0 2 * * ?")
    public void updateGameEventMsg() throws InterruptedException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info(String.format("赛事数据汇总--->>>第%s次执行，当前时间为：%s", refreshStorageCount++, dateFormat.format(new Date())));
        try {
            dataReductionService.updateGameEventMsg();
        }catch (Exception e){
            logger.error("赛事数据汇总--->>>第%s次执行失败,原因: {}", e);
        }
    }

    /**
     * 刷新个人积分数据,610分钟刷新一次,即更新10小时多一点的
     *
     * */
    @Scheduled(cron = "0 0 6,14,22 * * ?")
    public void updateUserScoreAndIntegral() throws InterruptedException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info(String.format("个人积分和评级汇总--->>>第%s次执行，当前时间为：%s", refreshStorageCount++, dateFormat.format(new Date())));
        try {
            //TODO这里时间带处理
            dataReductionService.updateUserScoreAndIntegral(610);
        }catch (Exception e){
            logger.error("个人积分和评级汇总--->>>第%s次执行失败,原因: {}", e);
        }
    }

    /**
     * 用户报名比赛开始通知, 应该5分钟刷新一次
     *
     * */
    @Scheduled(cron = "0 0/5 * * * ?")
    public void gameEventStartRemind() throws InterruptedException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info(String.format("用户报名比赛开始通知--->>>第%s次执行，当前时间为：%s", refreshStorageCount++, dateFormat.format(new Date())));
        try {
            dataReductionService.gameEventStartRemind(5);
        }catch (Exception e){
            logger.error("用户报名比赛开始通知--->>>第%s次执行失败,原因: {}", e);
        }
    }


    /**
     * 用户报名比赛开始通知, 应该10分钟刷新一次
     *
     * */
    @Scheduled(cron = "0 0/10 * * * ?")
    public void gameBeforeOneHourEventStartRemind() throws InterruptedException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info(String.format("用户报名前1小时比赛开始通知--->>>第%s次执行，当前时间为：%s", refreshStorageCount++, dateFormat.format(new Date())));
        try {
            dataReductionService.gameBeforeOneHourEventStartRemind(10);
        }catch (Exception e){
            logger.error("用户报名前1小时比赛开始通知--->>>第%s次执行失败,原因: {}", e);
        }
    }


    /**
     * mq异常处理, 应该3分钟刷新一次
     *
     * */
    @Scheduled(cron = "0 0/3 * * * ?")
    public void operateExceptionMQ() throws InterruptedException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info(String.format("开始处理超过6分钟未处理的内部消息>>>第%s次执行，当前时间为：%s", refreshStorageCount++, dateFormat.format(new Date())));
        try {
            gameMQLog.operateExceptionMQ();
        }catch (Exception e){
            logger.error("开始处理超过6分钟未处理的内部消息--->>>第%s次执行失败,原因: {}", e);
        }
    }
}
